package com.itelite.service;

import com.github.pagehelper.PageInfo;
import com.itelite.domain.dto.Diversion;
import com.itelite.domain.dto.GroupMemberParam;
import com.itelite.domain.dto.UserVo;
import com.itelite.domain.pojo.Group;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/8/7-16:49
 **/
public interface GroupService {
    /**
     * 获取整个IT培优的组织架构
     * @return 返回组完整的织架构
     */
    Group getGroupTree();

    /**
     * 通过组编号查询组名
     * @param groupId 组编号
     * @return 返回组名
     */
    String queryGroupNameByGroupId(Integer groupId);

    /**
     * 根据组长编号查询其管理的组编号
     * @param userId 组长编号
     * @return 返回组编号
     */
    Integer queryGroupIdByUserId(Integer userId);

    /**
     * 获取组织架构中的叶节点小组用于导出名单
     * @return 返回叶节点小组名字
     */
    String[] getGroupLeafNode();
    /**
     * 获取组织架构中的三级小组用于导出名单
     * @return 返回三级小组名字
     */
    String[] getImportableGroup();

    List<Group> getImportableGroup1();
    /**
     * 获取所有组信息
     * @return 所有组信息（无结构）
     */
    List<Group> getGroups();

    /**
     * 查询组内成员
     * @param param 查询参数
     * @return 返回成员信息
     */
    PageInfo<UserVo> queryGroupMember(GroupMemberParam param);

    /**
     * 获取当前登录用户可控制的组结构
     * @return 组结构
     */
    Group getUserControlGroup();
    /**
     * 获取当前登录用户可控制的组结构(列表结构)
     * @return 组结构
     */
    List<Group> getUserControlGroupList();

    /**
     * 根据groupId获取对应组结构
     * @param targetGroupId 目标组id
     * @return 组结构
     */
    Group getGroupRoot(Integer targetGroupId);

    /**
     * 添加新组

     * @return 是否添加成功
     */
    boolean addGroup(Map<String,Object> params) throws IOException;

    /**
     * 修改组信息
     * @param group 组信息
     * @param file 图片
     * @return 是否更新成功
     */
    boolean updateGroup(Group group, MultipartFile file);
    Integer[] getGroupIds(int groupId);

    /**
     * 删除小组
     * @param groupId 小组id
     * @return 是否删除
     */
    boolean deleteGroup(Integer groupId);

    /**
     * 小组分流
     * @param diversion 分流信息
     * @return 是否分流成功
     */
    boolean diversionGroup(Diversion diversion);

    /**
     * 发送邮件时是否发送给对应的组
     * @return 小组名单
     */
    List<Group> getSendEmailGroup();

    void updateGroupSendState(Integer groupId, Integer state);

    void updateGroupImportable(Integer groupId, Integer state);

    /**
     * 获取小组名字
     * @param groupId 小组编号
     * @return
     */
    String getGroupName(Integer groupId);
}
